perm filename SPECIA.MSG[COM,LSP] blob sn#820696 filedate 1986-07-12 generic text, type C, neo UTF8
COMMENT āŠ—   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	Consider this example:
C00004 ENDMK
CāŠ—;
Consider this example:

(defun bazola (a)
 (let* ((a (foo))
	(b (+ a 3 (foo)))
	(a (+ b a)))
      (declare (special a b)) ...))

where foo is a function that refers freely to a.
I will now rename the variables by adding an index to each to
make it easier to understand to what I'm referring at all times.

<a0>
(defun bazola (a1)
 (let* ((a2 (foo))
	(b (+ a3 3 (foo)))
	(a4 (+ b a5)))
      (declare (special a b)) ...))

where a0...a5 all are synonyms for a,  and a0 is the global, a.
Now we expand according to Pavel's proposal:

<a0>
(defun bazola (a1)
       (let ((a2 (foo)))
        (declare (special a))
	(let ((b (+ a3 3 (foo))))
         (declare (special b))
	 (let ((a4 (+ b a5))) ...))))

A1 is a lexical variable.
A2 is special (and dynamically rebinds the global A0)
A3 refers to the special A2 (A0)
A4 is a lexical variable, whose value is set to that of the
   special A2 (A0)

If we want A4 to also be special, then we must write:

(defun bazola (a)
 (let* ((a (foo))
	(b (+ a 3 (foo))))
      (declare (special a b))
      (let ((a (+ b a))) (declare (special a)) ...)))